﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using NHibernate;
using Caduceu.Estudos.Entidades;

namespace Caduceu.Estudos.DAL
{
    //Dao = Data Access Object
    public class MovimentoContaDao : DaoBase
    {
        public MovimentoContaDao(DbSession dbSession)
            : base(dbSession)
        {
            
        }

        public void SalvarMovimento(MovimentoConta movimentoConta)
        {
            this.session.Save(movimentoConta);
        }

        public Dictionary<int, decimal> LevantarMovimentosTotais()
        {
            // este método fará queries normais, mas compartilhando a mesma conexão e mesma transação
            // que está sendo utilizada pelo nhibernate.
            //
            // aqui vamos usar a query diretamente no fonte, mas o mais correto é que ela fique em
            // um 'repositório de queries', para que possa ser usada em todos os locais da aplicação
            // em que for necessária.

            Dictionary<int, decimal> movimentos = new Dictionary<int, decimal>();
            
            IDbCommand command = DbFactory.CreateCommand();
            
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("SELECT ID_CTA_MOV, SUM(VL_MOV * CASE TP_MOV WHEN 'D' THEN -1 WHEN 'C' THEN 1 END) AS TOTAL_MOV");
            sb.AppendLine("FROM CAD_MOV_CONTAB");
            sb.AppendLine("GROUP BY ID_CTA_MOV;");

            command.CommandText = sb.ToString();
            command.Connection = session.Connection;
            IDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                movimentos.Add(Convert.ToInt32(reader["ID_CTA_MOV"]), Convert.ToDecimal(reader["TOTAL_MOV"])); 
            }

            reader.Close();

            return movimentos;
        }
    }
}
